package com.thx.user.service;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.thx.common.datasource.DataSource;
import com.thx.common.service.ExtendPropertyManager;
import com.thx.common.util.AppContext;
import com.thx.common.util.PasswordUtil;
import com.thx.common.web.WebConstant;
import com.thx.org.OrgManagerFactory;
import com.thx.user.OrgChangeListener4User;
import com.thx.user.dao.UserDao;
import com.thx.user.model.User;

/**
 * 建立日期 : Jul 31, 2012 4:32:46 PM<br>
 * 作者 : 贾红磊<br>
 * 模块 : <br>
 * 描述 : <br>
 * 修改历史: 序号 日期 修改人 修改原因 <br>
 * 1 <br>
 * 2 <br>
 */
@Service
@DataSource("dataSourceB")
@Transactional(readOnly = true)
public class UserManager extends ExtendPropertyManager<User> {

  @Autowired
  private UserDao userDao;

  public UserDao getUserDao() {
    return userDao;
  }

  public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
  }

  /**
   * 当组织机构有变化时，需要人员信息跟着变化
   */
  @PostConstruct
  public void addOrgChangeEventListener() {
    OrgManagerFactory.getOrgManager().addListener(new OrgChangeListener4User());
  }

  @Transactional(readOnly = false)
  public void save(User user) {
    String userId = user.getUserId();
    // 如果是新增用户，对盐和密码做特殊的处理
    if (userId == null || userId.length() <= 0) {
      UUID uuid = UUID.randomUUID();
      user.setSalt(uuid.toString());
      String pwd = PasswordUtil.encrypt(user.getPassword(), user.getSalt());
      user.setPassword(pwd);
      // 加密类型
      String algorithmName = AppContext.getProperties(WebConstant.ENCRYPTED_TYPE);
      user.setPwdFormat(algorithmName);
      user.setLastPwdChange(new Date());
    }
    super.save(user);
  }

  @Transactional(readOnly = false)
  public void delStatus(Serializable... ids) {
    if (ids != null && ids.length > 0) {
      for (Serializable id : ids) {
        User user = this.get(id);
        user.getRoles().clear();
        user.setStatus("0");
        save(user);
      }

    }
  }

  public List<User> searchUsers(List<String> exldUserIds, String realName) {
    return userDao.searchUsers(exldUserIds, realName);
  }

  public List<User> searchUser(String userName, String realName, String email, String mobilePhone,
      String depId) {
    return userDao.searchUser(userName, realName, email, mobilePhone, depId);
  }


  public User findByName(String userName) {
    return userDao.findByUserName(userName);
  }

  public User findByPhone(String mobilePhone) {
    return userDao.findByPhone(mobilePhone);
  }

  public User findByEmail(String email) {
    return userDao.findByEmail(email);
  }

  public User findByNameAndPasswd(String userName, String passwd) {
    return userDao.findByNameAndPasswd(userName, passwd);
  }

  public User findByPhoneAndPasswd(String phone, String passwd) {
    return userDao.findByPhoneAndPasswd(phone, passwd);
  }

  public List<User> findByDeptId(String deptId) {
    return userDao.findByDeptId(deptId);
  }

  public User findByDeviceIdAndImsi(String userName, String deviceId, String imsi) {
    return userDao.findByDeviceIdAndImsi(userName, deviceId, imsi);
  }

  public User findByPwd(String userId, String deviceId, String imsi) {
    return userDao.findByPwd(userId, deviceId, imsi);
  }

  /**
   * 记录用户登录失败信息
   *
   * @author Xuejw 2016年5月10日 下午3:15:50
   * @param userId 登录用户id
   * @param failedCount 失败次数
   * @param failedDate 失败日期
   * @return
   */
  @Transactional(readOnly = false)
  public int saveloginErrorInfo(String userId, int failedCount, Date failedDate) {
    return userDao.saveloginErrorInfo(userId, failedCount, failedDate);
  }

  /**
   * 记录用户成功登录系统，并清除登录失败记录
   *
   * @author Xuejw 2016年5月10日 下午3:16:06
   * @param userId 登录用户id
   * @param loginDate 登录时间
   * @return
   */
  @Transactional(readOnly = false)
  public int saveloginSuccessInfo(String userId, Date loginDate) {
    return userDao.saveloginSuccessInfo(userId, loginDate);
  }

  /**
   * 记录密码修改信息
   *
   * @author Xuejw 2016年5月11日 下午6:00:41
   * @param operUserId
   * @param userId
   * @param updateDate
   * @return
   */
  @Transactional(readOnly = false)
  public int setPwd(String pwd,String pwdFormat,String userId,String operUserId,Date updateDate) {
    return userDao.setPwd(pwd,pwdFormat,userId,operUserId,updateDate);
  }
}
